Combo box flipping support.
authorKristian Rietveld <kris@gtk.org>
Fri, 12 Dec 2003 20:08:58 +0000 (20:08 +0000)
committerKristian Rietveld <kristian@src.gnome.org>
Fri, 12 Dec 2003 20:08:58 +0000 (20:08 +0000)
Fri Dec 12 21:00:12 2003  Kristian Rietveld  <kris@gtk.org>

Combo box flipping support.

* gtk/gtkcombobox.c (gtk_combo_box_menu_position),
(gtk_combo_box_size_allocate): support RTL flipping (#126518,
patch from Matthias Clasen),
(gtk_combo_box_popup): fix popup window alignment if there's a
cell view frame visible (#126518, patch from Semion Chichelnitsky).

* gtk/gtkcellview.c (gtk_cell_view_expose): support RTL flipping
(#128348, patch from Semion Chichelnitsky).

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkcellview.c
gtk/gtkcombobox.c

index f3f2ca99bc3fe11c60d3d30fbd7056535c3932d6..a33f30f417b68b7037f5e6197eb268462b222372 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Fri Dec 12 21:00:12 2003  Kristian Rietveld  <kris@gtk.org>
+
+       Combo box flipping support.
+
+       * gtk/gtkcombobox.c (gtk_combo_box_menu_position),
+       (gtk_combo_box_size_allocate): support RTL flipping (#126518,
+       patch from Matthias Clasen),
+       (gtk_combo_box_popup): fix popup window alignment if there's a
+       cell view frame visible (#126518, patch from Semion Chichelnitsky).
+
+       * gtk/gtkcellview.c (gtk_cell_view_expose): support RTL flipping
+       (#128348, patch from Semion Chichelnitsky).
+
 Fri Dec 12 01:13:34 2003  Matthias Clasen  <maclas@gmx.de>
 
        * examples/gtkdial/gtkdial.c:
index f3f2ca99bc3fe11c60d3d30fbd7056535c3932d6..a33f30f417b68b7037f5e6197eb268462b222372 100644 (file)
@@ -1,3 +1,16 @@
+Fri Dec 12 21:00:12 2003  Kristian Rietveld  <kris@gtk.org>
+
+       Combo box flipping support.
+
+       * gtk/gtkcombobox.c (gtk_combo_box_menu_position),
+       (gtk_combo_box_size_allocate): support RTL flipping (#126518,
+       patch from Matthias Clasen),
+       (gtk_combo_box_popup): fix popup window alignment if there's a
+       cell view frame visible (#126518, patch from Semion Chichelnitsky).
+
+       * gtk/gtkcellview.c (gtk_cell_view_expose): support RTL flipping
+       (#128348, patch from Semion Chichelnitsky).
+
 Fri Dec 12 01:13:34 2003  Matthias Clasen  <maclas@gmx.de>
 
        * examples/gtkdial/gtkdial.c:
index f3f2ca99bc3fe11c60d3d30fbd7056535c3932d6..a33f30f417b68b7037f5e6197eb268462b222372 100644 (file)
@@ -1,3 +1,16 @@
+Fri Dec 12 21:00:12 2003  Kristian Rietveld  <kris@gtk.org>
+
+       Combo box flipping support.
+
+       * gtk/gtkcombobox.c (gtk_combo_box_menu_position),
+       (gtk_combo_box_size_allocate): support RTL flipping (#126518,
+       patch from Matthias Clasen),
+       (gtk_combo_box_popup): fix popup window alignment if there's a
+       cell view frame visible (#126518, patch from Semion Chichelnitsky).
+
+       * gtk/gtkcellview.c (gtk_cell_view_expose): support RTL flipping
+       (#128348, patch from Semion Chichelnitsky).
+
 Fri Dec 12 01:13:34 2003  Matthias Clasen  <maclas@gmx.de>
 
        * examples/gtkdial/gtkdial.c:
index f3f2ca99bc3fe11c60d3d30fbd7056535c3932d6..a33f30f417b68b7037f5e6197eb268462b222372 100644 (file)
@@ -1,3 +1,16 @@
+Fri Dec 12 21:00:12 2003  Kristian Rietveld  <kris@gtk.org>
+
+       Combo box flipping support.
+
+       * gtk/gtkcombobox.c (gtk_combo_box_menu_position),
+       (gtk_combo_box_size_allocate): support RTL flipping (#126518,
+       patch from Matthias Clasen),
+       (gtk_combo_box_popup): fix popup window alignment if there's a
+       cell view frame visible (#126518, patch from Semion Chichelnitsky).
+
+       * gtk/gtkcellview.c (gtk_cell_view_expose): support RTL flipping
+       (#128348, patch from Semion Chichelnitsky).
+
 Fri Dec 12 01:13:34 2003  Matthias Clasen  <maclas@gmx.de>
 
        * examples/gtkdial/gtkdial.c:
index f3f2ca99bc3fe11c60d3d30fbd7056535c3932d6..a33f30f417b68b7037f5e6197eb268462b222372 100644 (file)
@@ -1,3 +1,16 @@
+Fri Dec 12 21:00:12 2003  Kristian Rietveld  <kris@gtk.org>
+
+       Combo box flipping support.
+
+       * gtk/gtkcombobox.c (gtk_combo_box_menu_position),
+       (gtk_combo_box_size_allocate): support RTL flipping (#126518,
+       patch from Matthias Clasen),
+       (gtk_combo_box_popup): fix popup window alignment if there's a
+       cell view frame visible (#126518, patch from Semion Chichelnitsky).
+
+       * gtk/gtkcellview.c (gtk_cell_view_expose): support RTL flipping
+       (#128348, patch from Semion Chichelnitsky).
+
 Fri Dec 12 01:13:34 2003  Matthias Clasen  <maclas@gmx.de>
 
        * examples/gtkdial/gtkdial.c:
index cf3933442e50deef2926b8569261dd32bade1eae..b307573d609675117a9b447f74c33c01af043c45 100644 (file)
@@ -403,6 +403,7 @@ gtk_cell_view_expose (GtkWidget      *widget,
   GList *i;
   GtkCellView *cellview;
   GdkRectangle area;
+  gboolean rtl = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL);
 
   cellview = GTK_CELL_VIEW (widget);
 
@@ -439,7 +440,7 @@ gtk_cell_view_expose (GtkWidget      *widget,
   area = widget->allocation;
 
   /* we draw on our very own window, initialize x and y to zero */
-  area.x = widget->allocation.x;
+  area.x = widget->allocation.x + (rtl ? widget->allocation.width : 0); 
   area.y = widget->allocation.y;
 
   /* PACK_START */
@@ -454,6 +455,8 @@ gtk_cell_view_expose (GtkWidget      *widget,
         continue;
 
       area.width = info->real_width;
+      if (rtl)                                             
+         area.x -= area.width;
 
       gtk_cell_renderer_render (info->cell,
                                 event->window,
@@ -461,9 +464,12 @@ gtk_cell_view_expose (GtkWidget      *widget,
                                 /* FIXME! */
                                 &area, &area, &event->area, 0);
 
-      area.x += info->real_width;
+      if (!rtl)                                           
+         area.x += info->real_width;
     }
 
+   area.x = rtl ? widget->allocation.x : (widget->allocation.x + widget->allocation.width);  
+
   /* PACK_END */
   for (i = cellview->priv->cell_list; i; i = i->next)
     {
@@ -476,13 +482,16 @@ gtk_cell_view_expose (GtkWidget      *widget,
         continue;
 
       area.width = info->real_width;
+      if (!rtl)
+         area.x -= area.width;   
 
       gtk_cell_renderer_render (info->cell,
                                 widget->window,
                                 widget,
                                 /* FIXME ! */
                                 &area, &area, &event->area, 0);
-      area.x += info->real_width;
+      if (rtl)
+         area.x += info->real_width;
     }
 
   return FALSE;
index 1e5674e45baba42a66b810f7c721e3543155409d..1155a46d5a920949f9b90536a6d1564dbf64c07b 100644 (file)
@@ -694,7 +694,10 @@ gtk_combo_box_menu_position (GtkMenu  *menu,
 
   gtk_widget_size_request (GTK_WIDGET (menu), &req);
 
-  *x = sx + child->allocation.width - req.width;
+  if (gtk_widget_get_direction (GTK_WIDGET (combo_box)) == GTK_TEXT_DIR_RTL)
+    *x = sx;
+  else
+    *x = sx + child->allocation.width - req.width;
   *y = sy + child->allocation.height;
 
   if (GTK_WIDGET_NO_WINDOW (child))
@@ -742,6 +745,15 @@ gtk_combo_box_popup (GtkComboBox *combo_box)
 
   gdk_window_get_origin (sample->window,
                          &x, &y);
+
+  if (combo_box->priv->cell_view_frame)
+    {
+       x -= GTK_CONTAINER (combo_box->priv->cell_view_frame)->border_width +
+            GTK_WIDGET (combo_box->priv->cell_view_frame)->style->xthickness;
+       width += 2 * (GTK_CONTAINER (combo_box->priv->cell_view_frame)->border_width +
+            GTK_WIDGET (combo_box->priv->cell_view_frame)->style->xthickness);
+    }
+
   gtk_widget_set_size_request (combo_box->priv->popup_window,
                                width, -1);
 
@@ -939,6 +951,7 @@ gtk_combo_box_size_allocate (GtkWidget     *widget,
   GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
   GtkAllocation child;
   GtkRequisition req;
+  gboolean is_rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL;
 
   widget->allocation = *allocation;
 
@@ -960,36 +973,54 @@ gtk_combo_box_size_allocate (GtkWidget     *widget,
           child.x = allocation->x + border_width + 1 + xthickness + 2;
           child.y = allocation->y + border_width + 1 + ythickness + 2;
 
-          width = allocation->width - (border_width + 1 + ythickness * 2 + 4);
+          width = allocation->width - (border_width + 1 + xthickness * 2 + 4);
 
           /* handle the childs */
           gtk_widget_size_request (combo_box->priv->arrow, &req);
           child.width = req.width;
           child.height = allocation->height - 2 * (child.y - allocation->y);
-          child.x += width - req.width;
+          if (!is_rtl)
+            child.x += width - req.width;
           gtk_widget_size_allocate (combo_box->priv->arrow, &child);
-
+          if (is_rtl)
+            child.x += req.width;
           gtk_widget_size_request (combo_box->priv->separator, &req);
           child.width = req.width;
-          child.x -= req.width;
+          if (!is_rtl)
+            child.x -= req.width;
           gtk_widget_size_allocate (combo_box->priv->separator, &child);
 
-          child.width = child.x;
-          child.x = allocation->x + border_width + 1 + xthickness + 2;
-          child.width -= child.x;
+          if (is_rtl)
+            {
+              child.x += req.width;
+              child.width = allocation->x + allocation->width 
+                - (border_width + 1 + xthickness + 2) - child.x;
+            }
+          else 
+            {
+              child.width = child.x;
+              child.x = allocation->x + border_width + 1 + xthickness + 2;
+              child.width -= child.x;
+            }
 
           gtk_widget_size_allocate (GTK_BIN (widget)->child, &child);
         }
       else
         {
           gtk_widget_size_request (combo_box->priv->button, &req);
-          child.x = allocation->x + allocation->width - req.width;
+          if (is_rtl)
+            child.x = allocation->x;
+          else
+            child.x = allocation->x + allocation->width - req.width;
           child.y = allocation->y;
           child.width = req.width;
           child.height = allocation->height;
           gtk_widget_size_allocate (combo_box->priv->button, &child);
 
-          child.x = allocation->x;
+          if (is_rtl)
+            child.x = allocation->x + req.width;
+          else
+            child.x = allocation->x;
           child.y = allocation->y;
           child.width = allocation->width - req.width;
           gtk_widget_size_allocate (GTK_BIN (widget)->child, &child);
@@ -1001,14 +1032,20 @@ gtk_combo_box_size_allocate (GtkWidget     *widget,
 
       /* button */
       gtk_widget_size_request (combo_box->priv->button, &req);
-      child.x = allocation->x + allocation->width - req.width;
+      if (is_rtl)
+        child.x = allocation->x;
+      else
+        child.x += allocation->x + allocation->width - req.width;
       child.y = allocation->y;
       child.width = req.width;
       child.height = allocation->height;
       gtk_widget_size_allocate (combo_box->priv->button, &child);
 
       /* frame */
-      child.x = allocation->x;
+      if (is_rtl)
+        child.x = allocation->x + req.width;
+      else
+        child.x = allocation->x;
       child.y = allocation->y;
       child.width = allocation->width - req.width;
       child.height = allocation->height;